/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import entidad.Candidato;
import entidad.Cargo;
import frontera.dao.DAO;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 *
 * @author Sebastian
 */
public class AdministrarCandidatos extends Administrar<Candidato> {

    public AdministrarCandidatos() {
    }

    @Override
    protected DAO<Candidato> getDAO() {
        return SIRHApp.getInstance().getDAOCandidato();
    }

    public String crearCandidato(String nuevoNombre, String nuevaCedula, String nuevaProfesion, String nuevaAspiracionSal, String nuevoEstado, Cargo nuevoCargo) {

        String informacionValidacion = validarInformacion(nuevoNombre, nuevaCedula, nuevaProfesion, nuevaAspiracionSal, nuevoCargo);

        if (informacionValidacion.equals("")) {
            Candidato nuevoCandidato = new Candidato(nuevoNombre, nuevaCedula, nuevaProfesion, nuevaAspiracionSal, nuevoEstado, nuevoCargo);

            SIRHApp.getInstance().getSistema().agregarCandidato(nuevoCandidato);

            return "";
        }

        return informacionValidacion;
    }

    public boolean eliminarCandidato(int indice) {
        Candidato candidato = SIRHApp.getInstance().getSistema().getCandidatos().get(indice);

        return SIRHApp.getInstance().getSistema().eliminarCandidato(candidato);
    }

    public String actualizarCandidato(Candidato candidatoAntiguo, String nuevoNombre ,String nuevaCedula, String nuevaProfesion, String nuevaAspiracionSal, String nuevoEstado, Cargo nuevoCargo) {

        Candidato actCandidato = candidatoAntiguo;
        String informacionValidacion = validarInformacion(nuevoNombre, nuevaCedula, nuevaProfesion, nuevaAspiracionSal, nuevoCargo);

        if (informacionValidacion.equals("")) {
            
            Candidato nuevoCandidato = new Candidato(nuevoNombre, nuevaCedula, nuevaProfesion, nuevaAspiracionSal, nuevoEstado, nuevoCargo);
            getDAO().actualizar(actCandidato, nuevoCandidato);

            return "";
        }

        return informacionValidacion;
    }
    
    public boolean eliminarCandidato(Candidato borCandidato) {
        return SIRHApp.getInstance().getSistema().eliminarCandidato( borCandidato );
    }

    public String validarInformacion(String nombre, String cedula, String profesion, String aspiracionSalarial, Cargo cargoAsociado) {

        if (!verificarLongitudNombre(nombre)) {
            return ("El nombre debe tener una longitud mínima de 8 caracteres y máxima de 40.");
        }

        if (!verificarFormatoNombre(nombre)) {
            return ("El nombre debe tener solo valores alfabéticos.");
        }

        if (!verificarLongitudCedula(cedula)) {
            return ("La cedula debe tener una longitud mínima de 7 dígitos y máxima de 15.");
        }

        if (!verificarFormatoCedula(cedula)) {
            return ("La cedula debe ser un valor numérico.");
        }

        if (!verificarLongitudProfesion(profesion)) {
            return ("El nombre de la profesión debe tener una longitud mínima de 5 caracteres y máxima de 30.");
        }

        if (!verificarFormatoProfesion(profesion)) {
            return ("El nombre de la profesión debe tener solo valores alfabéticos.");
        }

        if (!verificarFormatoAspiracionSalarial(aspiracionSalarial)) {
            return ("La aspiración salarial debe tener solo valores numéricos.");
        }
        
        if (!verificarLongitudAspiracionSalarial(aspiracionSalarial)) {
            return ("La aspiración salarial debe ser un número positivo mayor a $100.000 y menor a $1.000'000.000.");
        }
        
        if (!verificarAspiracionCargo(cargoAsociado))
            return ("El cargo asociado a este candidato no ha sido seleccionado");

        return ("");
    }

    public boolean verificarLongitudNombre(String nombre) {
        return (nombre.length() >= 8 && nombre.length() <= 40);
    }

    public boolean verificarFormatoNombre(String nombre) {
        Pattern patternNombre = Pattern.compile("[^A-Za-zñáéíóú ]");
        Matcher matcherNombre = patternNombre.matcher(nombre);

        boolean esCadena = false;
        while (matcherNombre.find()){
            esCadena = true;
        }

        return (!esCadena);
    }


    public boolean verificarLongitudCedula(String cedula) {
        boolean parse = true;
        
        if (!(cedula.length() >= 7 && cedula.length() <= 15)) {
            parse = false;
        }

        return parse;
    }

    public boolean verificarFormatoCedula(String cedula) {
        boolean parse = true;
        try {
            Long.parseLong(cedula);
        } catch (NumberFormatException NFE) {
            parse = false;
        }

        return parse;
    }

    public boolean verificarLongitudProfesion(String profesion) {
        return (profesion.length() >= 5 && profesion.length() <= 40);
    }

    public boolean verificarFormatoProfesion(String profesion) {
        Pattern patternNombre = Pattern.compile("[^A-Za-zñáéíóú ]");
        Matcher matcherNombre = patternNombre.matcher(profesion);

        boolean esCadena = false;
        while (matcherNombre.find()){
            esCadena = true;
        }

        return (!esCadena);
    }

    public boolean verificarLongitudAspiracionSalarial(String aspiracionSalarial) {
        boolean parse = true;

        double salario = Double.parseDouble(aspiracionSalarial);

        if (!(salario >= 100000 && salario <= Math.pow(10.0, 9.0))) {
            parse = false;
        }

        return parse;
    }

    public boolean verificarFormatoAspiracionSalarial(String aspiracionSalarial) {

	if (aspiracionSalarial.matches("\\d*\\.\\d*") || aspiracionSalarial.matches("\\d*")){
		return true;
	}
	return false;
    }

    private boolean verificarAspiracionCargo(Cargo cargo) {
        if (cargo != null){
            return true;
        }
        return false;
    }
}
